/**
 * <p>Title: Snake</p>
 * <p>Copyright: (C) 2011 Gavin's Snake project. Licensed under the Apache License, Version 2.0 (the "License")</p>
 * @author Gavin
 */

package com.deaboway.snake;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

import com.deaboway.snake.util.Log;

// View 变种，用来处理 一组 贴片—— “icons”或其它可绘制的对象
public class TileView extends Canvas {

	protected static int mTileSize;

	// X轴的贴片数量
	protected static int mXTileCount;
	// Y轴的贴片数量
	protected static int mYTileCount;

	// X偏移量
	private static int mXOffset;
	// Y偏移量
	private static int mYOffset;

	// 贴片图像的图像数组
	// @J2ME 用Image替换BitMap
	private Image[] mTileArray;

	// 保存每个贴片的索引——二维数组
	private int[][] mTileGrid;

	// Paint对象（画笔、颜料）
	// @J2ME 不需要了，直接在Graphics中drawImage即可
	//private final Paint mPaint = new Paint();

	// 构造函数
	// @J2ME 资源和配置不再从XML文件中获取，直接在构造函数中配置好
	public TileView() {
		mTileSize = 12;
		// @J2ME 主动调用onSizeChanged() 
		Log.debug("TileView paint, width="+this.getWidth()+",height="+this.getHeight());
		onSizeChanged(this.getWidth(),this.getHeight());
	}

	// 设置贴片图片数组
	// @J2ME 用Image替换BitMap
	public void resetTiles(int tilecount) {
		mTileArray = new Image[tilecount];
	}

	// 回调：当该View的尺寸改变时调用，在onDraw()方法调用之前就会被调用，所以用来设置一些变量的初始值
	// 在视图大小改变的时候调用，比如说手机由垂直旋转为水平
	// @J2ME 现在需要主动调用该方法——注意：只能调用一次
	protected void onSizeChanged(int w, int h) {

		// 定义X轴贴片数量
		mXTileCount = (int) Math.floor(w / mTileSize);
		mYTileCount = (int) Math.floor(h / mTileSize);

		// X轴偏移量
		mXOffset = ((w - (mTileSize * mXTileCount)) / 2);

		// Y轴偏移量
		mYOffset = ((h - (mTileSize * mYTileCount)) / 2);

		// 定义贴片的二维数组
		mTileGrid = new int[mXTileCount][mYTileCount];

		// 清空所有贴片
		clearTiles();
	}

	// 给mTileArray这个Bitmap图片数组设置值
	// @J2ME 用Image替换BitMap
	public void loadTile(int key, Image image) {
		// 在数组里存入该Image
		mTileArray[key] = image;
	}

	// 清空所有贴片
	public void clearTiles() {
		for (int x = 0; x < mXTileCount; x++) {
			for (int y = 0; y < mYTileCount; y++) {
				// 全部设置为0
				setTile(0, x, y);
			}
		}
	}

	// 给某个贴片位置设置一个状态索引
	public void setTile(int tileindex, int x, int y) {
		mTileGrid[x][y] = tileindex;
	}

	// onDraw 在视图需要重画的时候调用，比如说使用invalidate刷新界面上的某个矩形区域
	// 用paint替换onDraw
	protected void paint(Graphics g) {
		// TODO Auto-generated method stub
		Log.debug("TileView paint, mXTileCount="+mXTileCount+",mYTileCount="+mYTileCount);
		
		for (int x = 0; x < mXTileCount; x += 1) {
			for (int y = 0; y < mYTileCount; y += 1) {
				// 当索引大于零，也就是不空时
				if (mTileGrid[x][y] > 0) {
					// mTileGrid中不为零时画此贴片
					//Log.debug("TileView paint mTileGrid["+x+"]["+y+"]="+mTileGrid[x][y]);
					g.drawImage(mTileArray[mTileGrid[x][y]], mXOffset + x
							* mTileSize, mYOffset + y * mTileSize, Graphics.TOP | Graphics.LEFT);
				}
			}
		}
	}
}